/**
 * Mini Core (apenas para testes)
 * 
 * Usa atual parte estrutura do framewor (Version - 0.3.0a)
 * Usado para referencia de nomeclatura
 */

window.jProton = function(elementID) {
  return document.getElementById(elementID);
  // alertado Set não incluso no Core para testes
  // return new jProton.Set().select(selector, context);
};

/* impementa a atual forma de namespace */
jProton._namespace = function(ns) {
  if (!ns)
    return;
  var n = ns.split('.');
  var target = window, o;
  for (var i = 0, ni; ni = n[i]; i++) {
    target = (o = target[ni]) ? o : target[ni] = {};
  }
  return target;
};
/* impementa a atual forma de extend */
jProton._extend = function() {
  var target = this, t = target, source, p, o,
      a0 = arguments[0], ai = 0, al = arguments.length;
  if (al > 1) {
    ai++;
    target = t = a0;
  }
  for(; source = arguments[ai]; ai++)
    for(var prop in source) {
      p = source[prop];
      if (prop.charAt(0) != '@') {
        if (p && p.splice) {
          var tp = t[prop];
          t[prop] = tp && tp.splice ? tp.concat(p) : new Array().concat(p);
        } else if (p && typeof p == 'object') {
          t[prop] = jProton.extend(t[prop] || {}, p);
        } else {
          t[prop] = p;
        }
      } else {
        if (prop == '@init') {
          p.call(t);
        } else if (prop == '@require') {
          for (var ext in p) {
            var v = p[ext];
            o = t.extensions[ext] || null;
            if (!o)
              throw 'A extensão "'+ext+'" deve estar instalada.';

            else if (o < v && v != 'all')
              throw 'A extensão "'+ext+'" deve ter a versão '+v+' ou superior.';
          }
        } else if (prop == '@extension') {
          o = t.extensions || (t.extensions = {});
          for (var name in p) {
            o[name] = p[name];
          }
        }
      }
    }
  return target;
};

/* Funcoes uteis para testes */

/* Not best solution, but... */
jProton.onReady = function(fn){
	var called = false,
		callInit = function(){
			if(!called){
				called = true;
				fn();
			}
		};
	if (document.addEventListener) {
		document.addEventListener("DOMContentLoaded", function(){
				callInit();
			}, false
		);
	}  else if (document.all && !window.opera) {
		document.write("<script id='DOMReady' defer=true src=//:><\/script>");  
		document.getElementById("DOMReady").onreadystatechange = function(){
			if (this.readyState == 'complete'){
				callInit();
			}
		};
	}
}

jProton.profile = function(){
	
	var TIME = 0,
	list = [],
	time = function(){
		return new Date().getTime();	
	};
	
	this.start = function(name){
		list[name] = time();
	};
	
	this.stop = function(name){
		return (list[name] = ((time() - list[name]) / 1000));
	};
	
	this.list = function(){
		return list;
	};
	
	return this;
}();

window.$ = jProton;